package com.whsxt.code;

/**
 * @author CodeYang
 * @Description 十进制 整数转 2 进制整数
 * @Date 2020/12/5 21:13
 */
public class ConvertBtoTen {

    public static void main(String[] args) {
//        binaryToDecimal(3);
//        binaryToDecimals(0.25);

        //给定一个十进制小数
        double d = 0.25;
        //转换
        double mul = d;
        StringBuffer buffer = new StringBuffer("0.");
        //定义一个计数器
        int count=0;
        do{
            //乘以2得到积
            double result =  mul*2;//1.250
            //从积中取出整数部分作为二进制位
            int i = (int)result;
            buffer.append(i);
            //计数
            count++;
            //判断是否够7位
            if(count==7){
                break;
            }
            //从积中取出小数部分作为下一次的乘数
            mul= result-i;
        }while(mul!=0); //判断乘数是否为0
        //输出十进制小数和二进制小数
        System.out.println(d+"---->"+buffer);
    }

    /**
     * 十进制整数转换为二进制整数十进制整数转换为二进制整数采用"除2取余，逆序排列"法。
     * 具体做法是：用2整除十进制整数，可以得到一个商和余数；再用2去除商，
     * 又会得到一个商和余数，如此进行，直到商为小于1时为止，
     * 然后把先得到的余数作为二进制数的低位有效位，后得到的余数作为二进制数的高位有效位，依次排列起来
     *
     * @param n
     */
    public static void binaryToDecimal(int n) {
        String str = "";
        while (n != 0) {
            // str = n % 2 + str;  n % 2 ===>  是得到 0或者1 所以同样可以用  & 运算符来操作
            str = (n & 1) + str;
            n = n / 2;
        }
        System.out.println(str);
    }

    /**
     * 十进制小数 转2 进制小数
     * 十进制小数转换成二进制小数采用"乘2取整，顺序排列"法。具体做法是：用2乘十进制小数，可以得到积，将积的整数部分取出，再用2乘余下的小数部分，又得到一个积，再将积的整数部分取出，如此进行，直到积中的小数部分为零，此时0或1为二进制的最后一位。或者达到所要求的精度为止。
     * 然后把取出的整数部分按顺序排列起来，先取的整数作为二进制小数的高位有效位，后取的整数作为低位有效位。
     *
     * @param number
     */
    public static void binaryToDecimals(double number) {
        StringBuilder str = new StringBuilder("0.");
        int len = 0;
        while (number != 0) {
            // 乘2 取整
            double result = number * 2;
            // 从积中取出整数部分作为二进制位:
            int barr = (int) result;
            // 拼接 str
            str.append(barr);
            len++;

            // 如果精确到小数点后7位结束循环
            if (len == 7) break;
                //从积取出小数部分,作为下一次的乘数
                result = result - barr;
        }
        System.out.println(str);
    }

}
